﻿using System;
using System.Windows.Forms;
using ProyectoSelva.Const;
using ProyectoSelva.Daos;
using ProyectoSelva.Dtos;
using EntitiesAndMappings.Entities;
using ProyectoSelva.Util;
using ProyectoSelva.Validate;

namespace ProyectoSelva.Forms.Mantenimiento
{
    public partial class FrmMantenimientoContrato : Form , IValidateForm
    {
        private Boolean _valido;

        public static FrmMantenimientoContrato Activo { set; get; }

        public Boolean CerroSinAccion { get; set; }

        public FrmMantenimientoContrato()
        {
            InitializeComponent();
            CerroSinAccion = false;
            if (Activo == null)
            {
                Activo = this;
            }
            _valido = true;
            Closed += EnCierre;
            dGridResultado.AutoGenerateColumns = false;
            AplicarPermisos();
        }

        private void AplicarPermisos()
        {
            var usuario = FrmInicioSelva.Usuario;
            tStripButtonModificar.Visible = Perfil.TIPO3.Equals(usuario.Perfil) || Perfil.TIPO4.Equals(usuario.Perfil);
            tStripButtonEliminar.Visible = Perfil.TIPO3.Equals(usuario.Perfil) || Perfil.TIPO4.Equals(usuario.Perfil);
            tStripButtonCrear.Visible = Perfil.TIPO3.Equals(usuario.Perfil) || Perfil.TIPO4.Equals(usuario.Perfil);
        }

        private void EnCierre(object sender, EventArgs e)
        {
            Activo = null;
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            txtNombres.Text = txtNombres.Text.Trim();
            txtApellidos.Text = txtApellidos.Text.Trim();
            txtDocumento.Text = txtDocumento.Text.Trim();
            var contrato = new Contrato
            {
                Trabajador = new Trabajador
                {
                    Nombres = String.IsNullOrEmpty(txtNombres.Text) ? null : txtNombres.Text,
                    Apellidos = String.IsNullOrEmpty(txtApellidos.Text) ? null : txtApellidos.Text,
                    NumeroDocumento = String.IsNullOrEmpty(txtDocumento.Text) ? null : txtDocumento.Text
                }
            };
            var proyectoSel = cmbProyecto.SelectedItem as Proyecto;
            if (proyectoSel == null || proyectoSel.Id != 0)
            {
                contrato.Proyecto = proyectoSel;
            }
            ActionExecutor.Execute(this, delegate
            {
                var contratoDao = new ContratoDAO();
                dGridResultado.DataSource = ContratoDTO.AListaDTO(contratoDao.Buscar(contrato));
            });
        }

        private void tStripButtonEliminar_Click(object sender, EventArgs e)
        {
            if (dGridResultado.CurrentRow != null)
            {
                var contratoDto = (ContratoDTO)dGridResultado.CurrentRow.DataBoundItem;
                ActionExecutor.Execute(this, delegate
                {
                    var contratoDao = new ContratoDAO();
                    contratoDto.Contrato.Estado = Estado.Eliminado;
                    contratoDao.Actualizar(contratoDto.Contrato);
                });
                btnBuscar_Click(sender, e);
            }
            else
            {
                MessageBox.Show(@"Debe seleccionar un elemento");
            }
        }

        private void tStripButtonModificar_Click(object sender, EventArgs e)
        {
            
            if (dGridResultado.CurrentRow!= null)
            {
                var contratoDao = new ContratoDAO();
                var contratoDto = (ContratoDTO) dGridResultado.CurrentRow.DataBoundItem;
                var form = new FrmActualizarContrato(contratoDao.Refresh((contratoDto.Contrato)));
                form.ShowDialog(this);
                if (!form.CerroSinAccion)
                {
                    btnBuscar_Click(sender, e);
                }
            }
            else
            {
                MessageBox.Show(@"Debe seleccionar un elemento");
            }
        }

        private void tStripButtonCrear_Click(object sender, EventArgs e)
        {
            var form = new FrmActualizarContrato(new Contrato());
            form.ShowDialog(this);
            if (!form.CerroSinAccion)
            {
                btnBuscar_Click(sender, e);
            }
        }

        private void FrmMantenimientoContrato_Load(object sender, EventArgs e)
        {
            ActionExecutor.Execute(this, delegate
            {
                var entidadGenericaDao=new EntidadGenericaDAO<Proyecto>();
                var proyectos = entidadGenericaDao.ListarActivos();
                cmbProyecto.DataSource = FormUtils.AddFirst(proyectos, new Proyecto
                {
                    Codigo = "",
                    Descripcion = "Ninguno"
                });
                
            });
        }

        public void Invalid()
        {
            _valido = false;
        }

        public bool IsValid()
        {
            return _valido;
        }
    }
}
